//题目:
// 给你一个整数数组 nums ，请你找出数组中乘积最大的非空连续 子数组（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。
// 测试用例的答案是一个 32-位 整数。
#include<iostream>
#include<limits.h>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int maxProduct(vector<int>& nums) 
    {
        //1.创建细化dp表
        vector<int> f(nums.size());//f[i]表示以第i个位置为结尾的乘积最大的连续子数组
        vector<int> g(nums.size());//g[i]表示以第i个位置为结尾的乘积最小的连续子数组
        //2.初始化
        f[0]=nums[0],g[0]=nums[0];
        //3.填表————动态转移方程       
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i]==0)
                f[i]=g[i]=0;
            else if(nums[i]>0)
            {
                f[i]=f[i-1]>0?nums[i]*f[i-1]:nums[i];
                g[i]=g[i-1]<0?nums[i]*g[i-1]:nums[i];
            }
            else
            {
                f[i]=g[i-1]<0?nums[i]*g[i-1]:nums[i];
                g[i]=f[i-1]>0?nums[i]*f[i-1]:nums[i];
            }
        }
        //4.确定返回值
        int ret=INT_MIN;
        for(int i=0;i<nums.size();i++)
            ret=max(ret,f[i]);
        return ret;
    }
};